%% 清空环境
clear; clc; close all;

%% 参数固定 (除 a1 外)
a0 = -2;
a2 = 0.14;
b0 = 1.3;
b1 = 0.1;
b2 = 1;
d1 = 0;
d2 = 0;

%% 选择多组 a1, 例如 [0, pi/2, pi, 3*pi/2, 2*pi]
a1_values = [0, pi/2, pi, 3*pi/2, 2*pi];  %  sin 函数有周期性，a₁ = 0 和 2π 的效果是完全相同
% 为每个 a1 分配不同颜色
colors = lines(length(a1_values)); 
  % lines() 函数返回一组可区分的颜色

% 迭代设置
N_total = 3000;    % 总迭代次数
N_trans = 500;     % 舍弃前 500 步作为瞬态
N_show  = N_total - N_trans;  % 最终展示步数

% 初始条件
x0 = 0.1;
y0 = 0.1;
z0 = 0.1;

%% 创建 3D 图
figure;

hold on;
grid on;
box on;
view(3);  % 3D 视角
xlabel('x_n','FontSize',12);
ylabel('y_n','FontSize',12);
zlabel('z_n','FontSize',12);
title('参数 a_1 变化引起的偏移现象','FontSize',14);

for idx = 1:length(a1_values)
    a1 = a1_values(idx);
    col = colors(idx,:);  % 取一条颜色
    
    % 预分配存储
    X = zeros(1, N_show); 
    Y = zeros(1, N_show);
    Z = zeros(1, N_show);
    
    % 赋初值
    x = x0; 
    y = y0; 
    z = z0;
    
    % 先跑瞬态
    for n = 1:N_trans
        x_new = x + y;
        y_new = sin(a0 * y^2 * sin(a1 + a2*x)) + b2*sin(z) + d1;
        z_new = b0*y + b1*z + d2;
        
        x = x_new; 
        y = y_new; 
        z = z_new;
    end
    
    % 记录瞬态后的轨迹
    for n = 1:N_show
        x_new = x + y;
        y_new = sin(a0 * y^2 * sin(a1 + a2*x)) + b2*sin(z) + d1;
        z_new = b0*y + b1*z + d2;
        
        x = x_new; 
        y = y_new; 
        z = z_new;
        
        X(n) = x; 
        Y(n) = y; 
        Z(n) = z;
    end
    
    % 在 3D 图中绘制轨迹 (散点或线)
    % 散点效果好些, 也可用 plot3() 绘制连线
    scatter3(X, Y, Z, 5, 'MarkerFaceColor', col, 'MarkerEdgeColor', 'none', ...
        'DisplayName', sprintf('a_1=%.2f', a1));
end

